<?php

namespace app\helper;

/**
 * 常用数学方法
 */
class Math
{
    /**
     * 计算多个集合的笛卡尔积
     * @param Array $sets 集合数组
     * @return Array
     */
    public static function cartesian(array $sets = []){
 
        // 保存结果
        $result = [];
        
        // 循环遍历集合数据
        for($i=0,$count=count($sets); $i<$count-1; $i++){   
            // 初始化
            $i==0 && $result = $sets[$i];
            // 保存临时数据
            $tmp = [];
            // 结果与下一个集合计算笛卡尔积
            foreach($result as $res){
                foreach($sets[$i+1] as $set){
                    !is_array($res) && $res = [$res];
                    $tmp[] = array_merge($res, [$set]);
                }
            }
            // 将笛卡尔积写入结果
            $result = $tmp;
        }
        $list = [];
        foreach($result as $row){
            // sort($row);
            $list[implode('_', $row)] = $row;
        }
        return $list;
    }
    /**
     * 球面两点之间的距离
     *
     * @param array $from
     * @param array $to
     * @return void
     */ 
    public static function distance(array $from, array $to){
        $lng1 = deg2rad($from['lng']);
        $lng2 = deg2rad($to['lng']);
        $lat1 = deg2rad($from['lat']);
        $lat2 = deg2rad($to['lat']);
        $val = pow(sin(($lat2 - $lat1)/2),2)+cos($lat1)*cos($lat2)*pow(sin(($lng2 - $lng1)/2),2);
        return 2 * asin(sqrt($val)) * 3958756;
    }
}
